package ai.people.netmon.utils;

/**
 * 脱敏
 *
 * @author yuanqinglong
 * @date 2022/4/28 10:54
 */
public class DesensitizationUtils {

    /**
     * 手机号 隐藏中间四位
     *
     * @param phone 电话
     * @return {@link String}
     */
    public static String hiddenPhone(String phone) {
        if (StringUtils.isBlank(phone)) {
            return phone;
        }
        return phone.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
    }

    /**
     * 车牌号 隐藏中间位
     *
     * @param plateNum 板num
     * @return {@link String}
     */
    public static String hiddenPlateNum(String plateNum) {
        return hiddenPlateNum(plateNum, StringPool.ASTERISK);
    }

    /**
     * 车牌号 隐藏中间位
     *
     * @param plateNum 板num
     * @return {@link String}
     */
    public static String hiddenPlateNum(String plateNum, String symbol) {
        if (StringUtils.isBlank(plateNum)) {
            return "";
        }
        return plateNum.substring(0, 3) + symbol + plateNum.substring(4);
    }

    /**
     * 身份证展示 前6位和后6位
     *
     * @param idCard 身份证
     * @return {@link String}
     */
    public static String hiddenIdCard(String idCard) {
        return hiddenIdCard(idCard, StringPool.ASTERISK);
    }

    /**
     * 身份证展示 前6位和后6位
     *
     * @param idCard 身份证
     * @return {@link String}
     */
    public static String hiddenIdCard(String idCard, String symbol) {
        if (StringUtils.isBlank(idCard)) {
            return "";
        }
        return StringUtils.left(idCard, 6).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(idCard, 4), StringUtils.length(idCard), symbol), "***"));
    }

    /**
     * 电子邮箱 邮箱前缀仅显示第一个字母，前缀其他隐藏，用星号代替，@及后面的地址显示，比如：d**@126.com>
     *
     * @param email 电子邮件
     * @return {@link String}
     */
    public static String hiddenEmail(String email) {
       return hiddenEmail(email,StringPool.ASTERISK);
    }

    /**
     * 电子邮箱 邮箱前缀仅显示第一个字母，前缀其他隐藏，用星号代替，@及后面的地址显示，比如：d**@126.com>
     *
     * @param email 电子邮件
     * @return {@link String}
     */
    public static String hiddenEmail(String email,String symbol) {
        if (StringUtils.isBlank(email)) {
            return "";
        }
        int index = StringUtils.indexOf(email, "@");
        if (index <= 1) {
            return email;
        } else {
            return StringUtils.rightPad(StringUtils.left(email, 1), index, symbol).concat(StringUtils.mid(email, index, StringUtils.length(email)));
        }
    }

    /**
     * 银行卡号前六位，后四位，其他用星号隐藏每位1个星号，比如：6222600**********1234>
     *
     * @param cardNum 卡num
     * @return {@link String}
     */
    public static String hiddenBankCard(String cardNum) {
        return hiddenBankCard(cardNum, StringPool.ASTERISK);
    }

    /**
     * 银行卡号前六位，后四位，其他用星号隐藏每位1个星号，比如：6222600**********1234>
     *
     * @param cardNum 卡num
     * @return {@link String}
     */
    public static String hiddenBankCard(String cardNum, String symbol) {
        if (StringUtils.isBlank(cardNum)) {
            return "";
        }
        return StringUtils.left(cardNum, 6).concat(StringUtils.removeStart(StringUtils.leftPad(StringUtils.right(cardNum, 4), StringUtils.length(cardNum), symbol), "******"));
    }

    /**
     * 密码
     * 【密码】密码的全部字符都用*代替，比如：******
     *
     * @param password 密码
     * @return {@link String}
     */
    public static String hiddenPassword(String password) {
        return hiddenPassword(password, StringPool.ASTERISK);
    }

    /**
     * 密码
     * 【密码】密码的全部字符都用*代替，比如：******
     *
     * @param password 密码
     * @return {@link String}
     */
    public static String hiddenPassword(String password, String symbol) {
        if (StringUtils.isBlank(password)) {
            return "";
        }
        String pwd = StringUtils.left(password, 0);
        return StringUtils.rightPad(pwd, StringUtils.length(password), symbol);
    }

    /**
     * 固定电话 后四位，其他隐藏，比如1234
     *
     * @param num 全国矿工工会
     * @return {@link String}
     */
    public static String hiddenFixedPhone(String num) {
        return hiddenFixedPhone(num, StringPool.ASTERISK);
    }

    /**
     * 固定电话 后四位，其他隐藏，比如1234
     *
     * @param num 全国矿工工会
     * @return {@link String}
     */
    public static String hiddenFixedPhone(String num, String symbol) {
        if (StringUtils.isBlank(num)) {
            return "";
        }
        return StringUtils.leftPad(StringUtils.right(num, 4), StringUtils.length(num), symbol);
    }

    /**
     * 隐藏中文名字只显示第一个汉字，其他隐藏为2个星号，比如：李**
     *
     * @param fullName 全名
     * @return {@link String}
     */
    public static String hiddenChineseName(String fullName) {
        return hiddenChineseName(fullName, StringPool.ASTERISK);
    }

    /**
     * 隐藏中文名字只显示第一个汉字，其他隐藏为2个星号，比如：李**
     *
     * @param fullName 全名
     * @return {@link String}
     */
    public static String hiddenChineseName(String fullName, String symbol) {
        if (StringUtils.isBlank(fullName)) {
            return "";
        }
        String name = StringUtils.left(fullName, 1);
        return StringUtils.rightPad(name, StringUtils.length(fullName), symbol);
    }

    /**
     * 隐藏地址只显示到地区，不显示详细地址，比如：北京市海淀区****
     *
     * @param sensitiveSize 敏感信息长度
     * @param address       地址
     * @return {@link String}
     */
    public static String hiddenAddress(String address, int sensitiveSize) {
        if (StringUtils.isBlank(address)) {
            return "";
        }
        int length = StringUtils.length(address);
        return StringUtils.rightPad(StringUtils.left(address, length - sensitiveSize), length, "*");
    }

}

